package global

import (
	"os"
	"path/filepath"
	"sync"
)

var RootDir string

// sync.Once 的作用是多次调用但只执行一次，
// sync.Once 只有一个方法，Once.Do()，向 Do 传入一个函数，这个函数在第一次执行 Once.Do() 的时候会被调用，
// 以后再执行 Once.Do() 将没有任何动作，即使传入了其它的函数，也不会被执行，
// 如果要执行其它函数，需要重新创建一个 Once 对象。Once 可以安全的在多个例程中并行使用。
var once = new(sync.Once)

func Init() {
	once.Do(func() {
		inferRootDir()
		initConfig()
	})
}

// inferRootDir 推断出项目根目录
func inferRootDir() {
	cwd, err := os.Getwd() //os.Getwd()获取当前工作目录
	if err != nil {
		panic(err)
	}
	var infer func(d string) string //infer 推断
	infer = func(d string) string {
		//这里要确保项目根目录下存在 template 目录
		if exists(d + "/template") {
			return d
		}

		return infer(filepath.Dir(d)) //如果目录 d 中不存在 template 目录，则在其上级目录中递归查找
	}

	RootDir = infer(cwd)
}

func exists(filename string) bool {
	_, err := os.Stat(filename) //获取文件信息
	return err == nil || os.IsExist(err)
}
